home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / MATH / ZSCALE / ZSCALE.PAS
Pascal/Delphi Source File  |  1994-05-18  |  2KB  |  70 lines

  1. Procedure Zscale(Zmin, Zmax : Real; Var Z1, Z2, Zinc : Real; Var Ndivs, Pwr : 
  2.   Integer);
  3.  
  4. (*  Given values for Zmin and Zmax, procedure returns 
  5.     (1)  Z1 : the value to write at the left end of the axis
  6.     (2)  Z2 : the value to write at the right end of the axis
  7.     (3)  Zinc : the increment to use between tic marks
  8.     (4)  Ndivs : number of divisions to be used
  9.     (5)  Pwr : ALL ABOVE MUST BE MULTIPLIED BY 10**Pwr
  10. *)
  11. Var
  12.   Temp : Real;
  13.   Function Floor(X : Real) : Real;
  14.   Begin
  15.     Floor := Int(X);
  16.   End;
  17.   Function Ceil(X : Real) : Real;
  18.   Begin
  19.     If X = Int(X) Then Ceil := X
  20.     Else
  21.       If X > 0.0 Then Ceil := Int(X+1.0)
  22.       Else Ceil := Int(X-1.0);
  23.   End;
  24.   Function Log10(X : Real) : Real;
  25.   Begin
  26.     Log10 := Ln(X)/Ln(10.0);
  27.   End;
  28.  
  29. Begin
  30.   If Zmin > Zmax Then
  31.     Begin
  32.       Temp := Zmax;
  33.       Zmax := Zmin;
  34.       Zmin := Temp;
  35.     End;
  36.   If (Zmin = 0.0) And (Zmax = 0.0) Then Zmax := 1.0;
  37.   If Zmin = Zmax Then
  38.     Begin
  39.       If Zmin < 0.0 Then
  40.         Zmax := 0.9*Zmin
  41.       Else
  42.         Zmax := 1.1*Zmin;
  43.     End;
  44.   Zinc := (Zmax-Zmin)*0.2;
  45.   Temp := Log10(Zinc);
  46.   If Temp >= 0.0 Then Pwr := Trunc(Floor(Temp))
  47.   Else
  48.     Pwr := Trunc(Ceil(Temp));
  49.   If Zinc > 1.0 Then Inc(Pwr);
  50.   Temp := Zinc*PwrI(10.0, -Pwr);
  51.   Zinc := 0.1;
  52.   If Temp > 0.1 Then Zinc := 0.2;
  53.   If Temp > 0.2 Then Zinc := 0.25;
  54.   If Temp > 0.25 Then Zinc := 0.5;
  55.   If Temp > 0.5 Then Zinc := 1.0;
  56.   Zinc := Zinc*PwrI(10.0, Pwr);
  57.   If Zmin < Int(Zmin/Zinc)*Zinc Then
  58.     Zmin := (Int(Zmin/Zinc)-1)*Zinc
  59.   Else
  60.     Zmin := Int(Zmin/Zinc)*Zinc;
  61.   If Zmax > Int(Zmax/Zinc)*Zinc Then
  62.     Zmax := (Int(Zmax/Zinc)+1)*Zinc
  63.   Else
  64.     Zmax := Int(Zmax/Zinc)*Zinc;
  65.   Zinc := Zinc*PwrI(10.0, -Pwr);
  66.   Z1 := Zmin*PwrI(10.0, -Pwr);
  67.   Z2 := Zmax*PwrI(10.0, -Pwr);
  68.   Ndivs := Round((Z2-Z1)/Zinc);
  69. End;
  70.